package com.example.controller;

import com.example.domain.dto.PageResponse;
import com.example.domain.dto.product.*;
import com.example.domain.entity.enums.ProductStatus;
import com.example.exception.ApiResponse;
import com.example.service.ProductService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;

/**
 * 商品管理Controller
 * 
 * <p>提供商品的完整管理接口，包括：
 * <ul>
 *   <li>商品CRUD操作</li>
 *   <li>商品上下架管理</li>
 *   <li>商品搜索与查询</li>
 *   <li>批量操作</li>
 * </ul>
 * </p>
 * 
 * @author Means
 * @since 2025-10-28
 */
@Slf4j
@RestController
@RequestMapping("/api/products")
@RequiredArgsConstructor
public class ProductController {
    
    private final ProductService productService;
    
    // ==================== CRUD操作 ====================
    
    /**
     * 创建商品
     * 
     * @param request 创建商品请求
     * @return 创建的商品列表项DTO（含价格信息）
     */
    @PostMapping
    public ApiResponse<ProductListItemDTO> createProduct(@Valid @RequestBody CreateProductRequest request) {
        log.info("创建商品: name={}, category={}", request.getName(), request.getCategory());
        ProductListItemDTO product = productService.createProduct(request);
        log.info("商品创建成功: id={}, name={}", product.getId(), product.getName());
        return ApiResponse.success(product);
    }
    
    /**
     * 更新商品
     * 
     * @param id 商品ID
     * @param request 更新商品请求
     * @return 更新后的商品列表项DTO（含价格信息）
     */
    @PutMapping("/{id}")
    public ApiResponse<ProductListItemDTO> updateProduct(
            @PathVariable String id,
            @Valid @RequestBody UpdateProductRequest request) {
        log.info("更新商品: id={}", id);
        ProductListItemDTO product = productService.updateProduct(id, request);
        log.info("商品更新成功: id={}", product.getId());
        return ApiResponse.success(product);
    }
    
    /**
     * 删除商品（软删除）
     * 
     * @param id 商品ID
     * @return 成功响应
     */
    @DeleteMapping("/{id}")
    public ApiResponse<Void> deleteProduct(@PathVariable String id) {
        log.info("删除商品: id={}", id);
        productService.deleteProduct(id);
        log.info("商品删除成功: id={}", id);
        return ApiResponse.success();
    }
    
    /**
     * 获取商品详情（仅包含商品基本信息，不含价格）
     * 
     * @param id 商品ID
     * @return 商品基本信息（含描述）
     */
    @GetMapping("/{id}")
    public ApiResponse<ProductListItemDTO> getProduct(@PathVariable String id) {
        log.debug("获取商品详情: id={}", id);
        ProductListItemDTO product = productService.getProductById(id);
        return ApiResponse.success(product);
    }  
    
    // ==================== 查询操作 ====================
    
    /**
     * 分页查询商品列表
     * 
     * @param request 搜索请求（包含分页、排序、过滤条件）
     * @return 商品分页列表
     */
    @PostMapping("/search")
    public ApiResponse<PageResponse<ProductListItemDTO>> searchProducts(
            @Valid @RequestBody ProductSearchRequest request) {
        log.debug("搜索商品: keyword={}, category={}, status={}, page={}, size={}", 
                request.getKeyword(), request.getCategory(), request.getStatus(), 
                request.getPageOrDefault(), request.getSizeOrDefault());
        PageResponse<ProductListItemDTO> result = productService.listProducts(request);
        log.debug("查询到 {} 条商品记录", result.getTotal());
        return ApiResponse.success(result);
    }
    
    /**
     * 简单分页查询（使用查询参数）
     * 
     * @param page 页码（默认0）
     * @param size 每页大小（默认20）
     * @param status 商品状态（可选）
     * @param category 商品分类（可选）
     * @return 商品分页列表
     */
    @GetMapping
    public ApiResponse<PageResponse<ProductListItemDTO>> listProducts(
            @RequestParam(defaultValue = "0") int page,
            @RequestParam(defaultValue = "20") int size,
            @RequestParam(required = false) ProductStatus status,
            @RequestParam(required = false) String category) {
        log.debug("分页查询商品: page={}, size={}, status={}, category={}", 
                page, size, status, category);
        
        ProductSearchRequest request = ProductSearchRequest.builder()
                .status(status)
                .category(category)
                .page(page)
                .size(size)
                .build();
        
        PageResponse<ProductListItemDTO> result = productService.listProducts(request);
        log.debug("查询到 {} 条商品记录", result.getTotal());
        return ApiResponse.success(result);
    }
    
    /**
     * 获取所有已上架的商品（带价格信息，用于列表展示）
     * 
     * @return 商品列表
     */
    @GetMapping("/active")
    public ApiResponse<List<ProductListItemDTO>> getActiveProducts() {
        log.debug("查询所有已上架商品");
        List<ProductListItemDTO> products = productService.getActiveProducts();
        log.debug("查询到 {} 个已上架商品", products.size());
        return ApiResponse.success(products);
    }
    
    /**
     * 搜索商品（按名称模糊查询，带价格信息，用于列表展示）
     * 
     * @param keyword 关键词
     * @return 商品列表
     */
    @GetMapping("/keyword")
    public ApiResponse<List<ProductListItemDTO>> searchByKeyword(@RequestParam String keyword) {
        log.debug("按关键词搜索商品: keyword={}", keyword);
        List<ProductListItemDTO> products = productService.searchProducts(keyword);
        log.debug("查询到 {} 个商品", products.size());
        return ApiResponse.success(products);
    }
    
    // ==================== 商品状态管理 ====================
    
    /**
     * 上架商品
     * 
     * @param id 商品ID
     * @return 更新后的商品列表项DTO（含价格信息）
     */
    @PutMapping("/{id}/activate")
    public ApiResponse<ProductListItemDTO> activateProduct(@PathVariable String id) {
        log.info("上架商品: id={}", id);
        ProductListItemDTO product = productService.activateProduct(id);
        log.info("商品上架成功: id={}", product.getId());
        return ApiResponse.success(product);
    }
    
    /**
     * 下架商品
     * 
     * @param id 商品ID
     * @return 更新后的商品列表项DTO（含价格信息）
     */
    @PutMapping("/{id}/deactivate")
    public ApiResponse<ProductListItemDTO> deactivateProduct(@PathVariable String id) {
        log.info("下架商品: id={}", id);
        ProductListItemDTO product = productService.deactivateProduct(id);
        log.info("商品下架成功: id={}", product.getId());
        return ApiResponse.success(product);
    }
    
    // ==================== 批量操作 ====================
    // 注：批量操作功能暂未被前端使用，待管理后台开发时再启用
}

